#ifndef __ZONGYI_SEQUENCE_SOLVER_HPP__
#define __ZONGYI_SEQUENCE_SOLVER_HPP__

#include "solver_types.h"
#include "gpu_solver_types.cuh"

class SequenceSolver
{
public:
    // 求解器类型
    // 0   ：CPU 双精度直接法求解
    // 1   ：CPU 双精度迭代法GMRES求解
    // 2   : CPU 双精度直接法（复用）求解
    // 1000: GPU 双精度直接法求解
    // 1001: GPU 双精度迭代法GMRES求解
    // 1002: GPU 双精度直接法（复用）求解
    const int solver_type = -1;
    // 预条件类型
    // 0  ：单精度直接法
    // 1  ：单精度BlockLU无耦合
    // 11 : 复用前一时步的单精度BlockLU无耦合
    // 2  : 单精度BlockLU一次耦合
    // 21 : 复用前一时步的单精度BlockLU一次耦合
    // 3  : 单精度BlockLU二次耦合
    // 31 : 复用前一时步的单精度BlockLU二次耦合
    // 91 : 复用前一时步的直接法
    // 92 : 重排后复用前一时步的直接法
    // else: 无预条件
    const int prec_type = -1;
    // 记录上一次求解的时间步
    int last_stepId = -1;
    std::vector<int> prev_hfs;

private:
    int last_nrows = -1;
    int store_nrows = -1;
    void* last_mem = nullptr;
    void* store_mem = nullptr;
    void* device_last_A = nullptr;
    void* device_store_A = nullptr;

public:
    SequenceSolver(int _sol_type, int _pc_type, int _first);
    ~SequenceSolver();
    void solve(const int step, const int nrows, double* A64, double* rhs64, TEST_TIME & record);
};



#endif